package com.wef.system.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;

import com.gfa4j.exception.ValidateRuntimeException;
import com.gfa4j.hibernate.BaseObject;
import com.gfa4j.service.impl.BaseServiceImpl;
import com.wef.system.entity.MenuGroup;
import com.wef.system.entity.MenuItem;
import com.wef.system.entity.domain.MenuGroupDomain;
import com.wef.system.entity.domain.MenuItemDomain;
import com.wef.system.service.MenuItemService;
import com.wef.system.service.MenuItemTitleService;

public class MenuItemServiceImpl extends BaseServiceImpl implements MenuItemService {

	private MenuItemTitleService menuItemTitleService;

	public MenuItemTitleService getMenuItemTitleService() {
		return menuItemTitleService;
	}

	public void setMenuItemTitleService(MenuItemTitleService menuItemTitleService) {
		this.menuItemTitleService = menuItemTitleService;
	}

	public MenuItem addMenuItem(MenuItem menuItem) {
		MenuItem newMenuItem = (MenuItem) super.saveObject(menuItem);
		if (menuItem.getMenuItemTitles() != null && menuItem.getMenuItemTitles().size() > 0) {
			menuItemTitleService.saveOrUpdateMenuItemTitles(menuItem.getMenuItemTitles(), newMenuItem.getMenuItemId());
		}
		return newMenuItem;
	}

	public MenuItem addMenuItemByParentId(MenuItem menuItem, String parentId) {
		List menuGroupList = super.findByProperty(MenuGroup.class, MenuGroupDomain.menuGroupId, parentId);

		MenuGroup menuGroup = (MenuGroup) menuGroupList.get(0);
		menuItem.setMenuGroup(menuGroup);

		MenuItem newMenuItem = (MenuItem) super.saveObject(menuItem);

		if (menuItem.getMenuItemTitles() != null && menuItem.getMenuItemTitles().size() > 0) {
			menuItemTitleService.saveOrUpdateMenuItemTitles(menuItem.getMenuItemTitles(), newMenuItem.getMenuItemId());
		}
		return newMenuItem;
	}

	public void deleteMenuItem(MenuItem menuItem) {
		List<String> initPropertys = new ArrayList<String>();
		initPropertys.add(MenuItemDomain.menuItemTitles);
		menuItem = (MenuItem) load(MenuItem.class, menuItem.getMenuItemId(), initPropertys);
		if (Hibernate.isPropertyInitialized(menuItem, MenuItemDomain.menuItemTitles) && menuItem.getMenuItemTitles().size() > 0) {
			menuItemTitleService.deleteMenuItemTitles(menuItem.getMenuItemTitles());
		}

		this.validateDelete(menuItem);
		super.deleteObject(menuItem);
	}

	public MenuItem saveOrUpdateMenuItem(MenuItem menuItem) {
		if (menuItem.getRowStatus() == BaseObject.ROWSTATUS_ADDED) {
			return this.addMenuItem(menuItem);
		}
		if (menuItem.getRowStatus() == BaseObject.ROWSTATUS_MODIFIED) {
			return this.updateMenuItem(menuItem);
		}
		if (menuItem.getRowStatus() == BaseObject.ROWSTATUS_DELETED) {
			this.deleteMenuItem(menuItem);
			return null;
		}
		return menuItem;
	}

	public Set<MenuItem> saveOrUpdateMenuItems(Set<MenuItem> menuItems) {
		StringBuilder errorString = new StringBuilder();
		for (MenuItem menuItem : menuItems) {
			try {
				saveOrUpdateMenuItem(menuItem);
			} catch (ValidateRuntimeException ex) {
				errorString.append(ex.getMessage() + "\n");
			}
		}
		if (errorString.length() > 0) {
			throw new ValidateRuntimeException(errorString.toString());
		}
		return menuItems;
	}

	public MenuItem updateMenuItem(MenuItem menuItem) {
		if (menuItem.getMenuItemTitles() != null && menuItem.getMenuItemTitles().size() > 0) {
			menuItemTitleService.saveOrUpdateMenuItemTitles(menuItem.getMenuItemTitles(), menuItem.getMenuItemId());
		}
		return (MenuItem) super.updateObject(menuItem);
	}

	public MenuItem updateMenuItemById(MenuItem menuItem) {
		if (menuItem.getMenuItemTitles() != null && menuItem.getMenuItemTitles().size() > 0) {
			menuItemTitleService.saveOrUpdateMenuItemTitles(menuItem.getMenuItemTitles(), menuItem.getMenuItemId());
		}

		List menuItemList = super.findByProperty(MenuItem.class, MenuItemDomain.menuItemId, menuItem.getMenuItemId());

		MenuItem updateMenuItem = (MenuItem) menuItemList.get(0);
		// updateMenuItem.setIsDialog(menuItem.getIsDialog());
		// updateMenuItem.setIsNewFun(menuItem.getIsNewFun());
		updateMenuItem.setShowInConsole(menuItem.getShowInConsole());
		//updateMenuItem.setShowInMenu(menuItem.getShowInMenu());
		updateMenuItem.setMenuItemDescKey(menuItem.getMenuItemDescKey());
		updateMenuItem.setMenuItemSeq(menuItem.getMenuItemSeq());
		updateMenuItem.setMenuItemUrl(menuItem.getMenuItemUrl());
		updateMenuItem.setClassName(menuItem.getClassName());
		updateMenuItem.setViewId(menuItem.getViewId());

		return updateMenuItem;
	}

	public List<MenuItem> getMenuItemByMenuGroupId(String menuGroupId) {
		MenuGroup menuGroup = (MenuGroup) load(MenuGroup.class, menuGroupId);
		List<MenuItem> menuItemList = super.findByProperty(MenuItem.class, MenuItemDomain.menuGroup, menuGroup);
		for (MenuItem menuItem : menuItemList) {
			Hibernate.initialize(menuItem.getMenuItemTitles());
		}
		return menuItemList;
	}
}
